/*
 * Copyright (c) 2020 - present, Inspur Genersoft Co., Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.inspur.edp.cef.generator.coreGenerator.base.entitygen.property;


import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.inspur.edp.caf.generator.baseInfo.AnnotationInfo;
import com.inspur.edp.caf.generator.baseInfo.AnnotationType;
import com.inspur.edp.caf.generator.baseInfo.TypeInfo;
import com.inspur.edp.cef.generator.common.MediatePropertyInfo;
import com.inspur.edp.cef.generator.coreGenerator.base.entitygen.EntityGeneratorContext;
import com.inspur.edp.cef.spi.jsonser.abstractcefchange.BefDateSerializer;
import java.util.ArrayList;
import java.util.HashMap;
import org.eclipse.jdt.core.dom.Assignment;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.Expression;
import org.eclipse.jdt.core.dom.ExpressionStatement;
import org.eclipse.jdt.core.dom.Modifier;
import org.eclipse.jdt.core.dom.ReturnStatement;
import org.eclipse.jdt.core.dom.TypeLiteral;

public class DatePropGenerator extends BaseTypePropGenerator {

  private EntityGeneratorContext privateEntityContext;
  private String privateNodeCode;
  private String privateFieldName;

  public DatePropGenerator(EntityGeneratorContext entityContext, String nodeCode,
      MediatePropertyInfo propertyInfo, String fieldName) {
    this(entityContext, nodeCode, propertyInfo, fieldName, false);
  }

  public DatePropGenerator(EntityGeneratorContext entityContext, String nodeCode,
      MediatePropertyInfo propertyInfo, String fieldName, boolean convertToUpperCase) {
    super(propertyInfo, fieldName, convertToUpperCase);
    privatePropertyInfo = propertyInfo;
    setEntityContext(entityContext);
    privateFieldName = fieldName;
    setNodeCode(nodeCode);
  }

  protected final EntityGeneratorContext getEntityContext() {
    return privateEntityContext;
  }

  protected final void setEntityContext(EntityGeneratorContext value) {
    privateEntityContext = value;
  }

  public final String getNodeCode() {
    return privateNodeCode;
  }

  public final void setNodeCode(String value) {
    privateNodeCode = value;
  }

  @Override
  protected final String getFieldName() {
    return privateFieldName;
  }

  @Override
  protected ArrayList<Modifier.ModifierKeyword> getSetterAccessModifier() {
    ArrayList<Modifier.ModifierKeyword> list = new ArrayList<>();
    list.add(Modifier.ModifierKeyword.PUBLIC_KEYWORD);
    return list;
  }

  @Override
  protected ArrayList<Modifier.ModifierKeyword> getGetterAccessModifier() {
    ArrayList<Modifier.ModifierKeyword> list = new ArrayList<>();
    list.add(Modifier.ModifierKeyword.PUBLIC_KEYWORD);
    return list;
  }

  @Override
  protected Block buildGetMethodBody() {
    Block block = ast.newBlock();
    ReturnStatement returnStatement = ast.newReturnStatement();
    returnStatement.setExpression(ast.newSimpleName(getFieldName()));
    block.statements().add(returnStatement);
    return block;
  }

  @Override
  protected Block buildSetMethodBody() {
    Block block = ast.newBlock();
    Assignment assignment = ast.newAssignment();
    assignment.setLeftHandSide(ast.newSimpleName(getFieldName()));
    assignment.setOperator(Assignment.Operator.ASSIGN);
    assignment.setRightHandSide(ast.newSimpleName("value"));
    ExpressionStatement expressionStatement = ast.newExpressionStatement(assignment);
    block.statements().add(expressionStatement);
    return block;
  }

  @Override
  protected ArrayList<AnnotationInfo> getSetterAttributeList() {
    ArrayList<AnnotationInfo> list = super.getSetterAttributeList();
    if (list == null) {
      list = new ArrayList<>();
    }

    list.add(getBefDateSerializerAnnoInfo());
    return list;
  }

  private AnnotationInfo getBefDateSerializerAnnoInfo() {
    AnnotationInfo info = new AnnotationInfo();
    info.setAst(ast);
    info.setAnnotationType(AnnotationType.Normal);

    String serializerType = BefDateSerializer.class.getName();
    HashMap<String, Expression> map = new HashMap<>();
    TypeLiteral typeLiteral = ast.newTypeLiteral();
    typeLiteral.setType(ast.newSimpleType(ast.newName(serializerType)));
    map.put("using", typeLiteral);
    info.setParams(map);
    info.setTypeInfo(new TypeInfo(JsonSerialize.class));

    addImport(serializerType);

    return info;
  }
}
